jetcrab\bytecode\expressions/
comparison.rs

1use crate::ast::Node;
2use crate::vm::instructions::Instruction;
3
4pub trait ComparisonGenerator {
5    fn generate_comparison_expression(&mut self, node: &Node);
6}
7
8pub trait ComparisonCore {
9    fn instructions(&mut self) -> &mut Vec<Instruction>;
10    fn visit_node(&mut self, node: &Node);
11}
12
13impl<T> ComparisonGenerator for T
14where
15    T: ComparisonCore,
16{
17    fn generate_comparison_expression(&mut self, node: &Node) {
18        if let Node::BinaryExpression(expr) = node {
19            self.visit_node(&expr.left);
20            self.visit_node(&expr.right);
21            match expr.operator.as_str() {
22                "<" => self.instructions().push(Instruction::Lt),
23                ">" => self.instructions().push(Instruction::Gt),
24                "<=" => self.instructions().push(Instruction::Le),
25                ">=" => self.instructions().push(Instruction::Ge),
26                "==" => self.instructions().push(Instruction::Eq),
27                "!=" => self.instructions().push(Instruction::Ne),
28                "===" => self.instructions().push(Instruction::StrictEq),
29                "!==" => self.instructions().push(Instruction::StrictNe),
30                _ => {}
31            }
32        }
33    }
34}